/*
 * This code based on Silicon Graphics, Inc.'s redbook
 * http://www.opengl.org/resources/code/samples/redbook/
 */

/*
 * Copyright (C) 2008 aki@akjava.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * original code license
 * Copyright (c) 1993-1997, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED 
 * Permission to use, copy, modify, and distribute this software for 
 * any purpose and without fee is hereby granted, provided that the above
 * copyright notice appear in all copies and that both the copyright notice
 * and this permission notice appear in supporting documentation, and that 
 * the name of Silicon Graphics, Inc. not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission. 
 *
 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
 * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 * 
 * US Government Users Restricted Rights 
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
 * clause at DFARS 252.227-7013 and/or in similar or successor
 * clauses in the FAR or the DOD or NASA FAR Supplement.
 * Unpublished-- rights reserved under the copyright laws of the
 * United States.  Contractor/manufacturer is Silicon Graphics,
 * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
 *
 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
 */

package com.akjava.android.openglsamples.redbook;

import java.nio.ByteBuffer;
import java.nio.ShortBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.content.Context;
import android.opengl.GLU;

import com.akjava.android.openglsamples.OpenGLUtils;


public class WrapRenderer extends RedBookSimpleRenderer {


	public WrapRenderer(Context context) {
       super(context);
    }


int	checkImageWidth= 64;
int	checkImageHeight =64;


ByteBuffer checkImage;
	void makeCheckImages()
	{
		checkImage=ByteBuffer.allocate(checkImageWidth*checkImageHeight*4);
	
	   int i, j, c;
	    
	   for (i = 0; i < checkImageHeight; i++) {
	      for (j = 0; j < checkImageWidth; j++) {
	         c = 0;
	         if(((((i&0x8)==0)^((j&0x8))==0))){
	        	 c=255;
	         }
	         checkImage.put((byte) c);
	         checkImage.put((byte) c);
	         checkImage.put((byte) c);
	         checkImage.put((byte) 255);
	        
	      }
	   }
	   
	   checkImage.position(0);
	   
	}
	
	
ShortBuffer mIndexBuffer2 ;
    public void setUpBuffers() {
        mFVertexBuffer = OpenGLUtils.allocateFloatBuffer(1000);
        mTextureBuffer = OpenGLUtils.allocateFloatBuffer(1000);
        mIndexBuffer = OpenGLUtils.allocateShortBuffer(1000);
        mIndexBuffer2 = OpenGLUtils.allocateShortBuffer(1000);
      
		   OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 0.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,-2.0f, -1.0f, 0.0f);
		   OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 3.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,-2.0f, 1.0f, 0.0f);
		   OpenGLUtils.addCoord2f(mTextureBuffer,3.0f, 3.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,0.0f, 1.0f, 0.0f);
		   OpenGLUtils.addCoord2f(mTextureBuffer,3.0f, 0.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,0.0f, -1.0f, 0.0f);

		   OpenGLUtils.addIndex(mIndexBuffer,0,1,2);
		   OpenGLUtils.addIndex(mIndexBuffer,2,3,0);
		   
		   OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 0.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,1.0f, -1.0f, 0.0f);
		   OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 3.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,1.0f, 1.0f, 0.0f);
		   OpenGLUtils.addCoord2f(mTextureBuffer,3.0f, 3.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,2.41421f, 1.0f, -1.41421f);
		   OpenGLUtils.addCoord2f(mTextureBuffer,3.0f, 0.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,2.41421f, -1.0f, -1.41421f);
		   

		   OpenGLUtils.addIndex(mIndexBuffer2,4,5,6);
		   OpenGLUtils.addIndex(mIndexBuffer2,6,7,4);
		   
        mFVertexBuffer.position(0);
        mTextureBuffer.position(0);
        mIndexBuffer.position(0);
        mIndexBuffer2.position(0);
    }
    

    public void onSurfaceChanged(GL10 gl, int w, int h) {
    	gl.glViewport(0, 0,  w,  h);
    	gl.glMatrixMode(GL10.GL_PROJECTION);
    	gl.glLoadIdentity();
    	   GLU.gluPerspective(gl,60.0f, (float) w/(float) h, 1.0f, 30.0f);
    	   gl.glMatrixMode(GL10.GL_MODELVIEW);
    	   gl.glLoadIdentity();
    	   gl.glTranslatef(0.0f, 0.0f, -3.6f);
    }


int mTextureID,mTextureID2;
    public void onDrawFrame(GL10 gl) {
    	if(clickButton){
    		if(wraps_repeat){
    		 gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
    		}else{
    			gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    		}
    		if(wrapt_repeat){
  		     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
    		}else{
    			gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    		}
    		clickButton=false;
    	}
    	gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);
    	gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
		
		gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
		gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
		
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
		
		  
	    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);
		gl.glEnable(GL10.GL_TEXTURE_2D);
		gl.glDrawElements(GL10.GL_TRIANGLES, 6,GL10.GL_UNSIGNED_SHORT, mIndexBuffer);
		 
       gl.glDrawElements(GL10.GL_TRIANGLES, 6,GL10.GL_UNSIGNED_SHORT, mIndexBuffer2);
       gl.glFlush();
    }



	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {setUpBuffers();
		   makeCheckImages();
		
		   gl.glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
		   gl.glShadeModel(GL10.GL_FLAT);
		   gl.glEnable(GL10.GL_DEPTH_TEST);

		   
		   gl.glPixelStorei(GL10.GL_UNPACK_ALIGNMENT, 1);

		   int[] textures = new int[1];
	        gl.glGenTextures(1, textures, 0);

	        mTextureID = textures[0];

	      
		   gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);
		   //no GL_CLAMP?
		   gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
		   gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
		   gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, 
				   GL10.GL_NEAREST);
		   gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, 
				   GL10.GL_NEAREST);
		   
		   gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, checkImageWidth, 
	                checkImageHeight, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, checkImage);
		   /*
		   Bitmap bitmap=OpenGLUtils.loadBitmap(mContext,R.drawable.gara);
		   GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
		   bitmap.recycle();
		   */
	        
	
		  

		   
		   gl.glEnable(GL10.GL_TEXTURE_2D);
		   
		   gl.glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
		   gl.glShadeModel(GL10.GL_FLAT);
		   gl.glEnable(GL10.GL_DEPTH_TEST);




	}

	private boolean wraps_repeat=true;
	private boolean wrapt_repeat=true;
    private boolean clickButton=false;

    
    public void actionCenter(){
    	wraps_repeat=true;
    	wrapt_repeat=true;
    	clickButton=true;
    }
	
    public void actionUp(){
    	wraps_repeat=true;
    	clickButton=true;
    }
    public void actionDown(){
    	wraps_repeat=false;
    	clickButton=true;
    }
    public void actionRight(){
    	wrapt_repeat=true;
    	clickButton=true;
    }
    public void actionLeft(){
    	wrapt_repeat=false;
    	clickButton=true;
    }


	
}


